package com.meatball.core

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.EnableAsync
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
import java.util.concurrent.Executor

/**
 * 配置线程池
 * @author 張翔宇
 * @since 2023年6月19日
 * @version 1.0
 */
@Configuration
@EnableAsync
class AsyncConfiguration {
    // 声明一个线程池(并指定线程池的名字)
    @Bean("MeatballTaskExecutor")
    fun asyncExecutor(): Executor {
        val executor = ThreadPoolTaskExecutor()
        //核心线程数5：线程池创建时候初始化的线程数
        executor.corePoolSize = 5
        //最大线程数5：线程池最大的线程数，只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.maxPoolSize = 5
        //缓冲队列500：用来缓冲执行任务的队列
        executor.queueCapacity = 500
        //允许线程的空闲时间60秒：当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.keepAliveSeconds = 60
        //线程池名的前缀：设置好了之后可以方便我们定位处理任务所在的线程池
        executor.setThreadNamePrefix("DailyAsync-")
        executor.initialize()
        return executor
    }
}
